// com/ybu/oodd/utils/context/ContextHolder.java
package com.ybu.oodd.utils.login;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 通用上下文持有者，基于 ThreadLocal 存储当前线程的上下文数据
 * 可用于存储：用户信息、traceId、租户ID、设备信息等
 */
public class ContextHolder {

    /**
     * 使用 ConcurrentHashMap 作为上下文容器，支持任意 key-value
     */
    private static final ThreadLocal<Map<String, Object>> contextHolder = new ThreadLocal<>();

    /**
     * 初始化上下文（在请求开始时调用）
     */
    public static void init() {
        contextHolder.set(new ConcurrentHashMap<>());
    }

    /**
     * 存入数据
     */
    public static void put(String key, Object value) {
        Map<String, Object> ctx = contextHolder.get();
        if (ctx == null) {
            throw new IllegalStateException("上下文未初始化，请先调用 ContextHolder.init()");
        }
        ctx.put(key, value);
    }

    /**
     * 获取数据（泛型安全）
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(String key) {
        Map<String, Object> ctx = contextHolder.get();
        if (ctx == null) return null;
        return (T) ctx.get(key);
    }

    /**
     * 判断是否包含某个 key
     */
    public static boolean contains(String key) {
        Map<String, Object> ctx = contextHolder.get();
        return ctx != null && ctx.containsKey(key);
    }

    /**
     * 移除某个 key
     */
    public static void remove(String key) {
        Map<String, Object> ctx = contextHolder.get();
        if (ctx != null) {
            ctx.remove(key);
        }
    }

    /**
     * 清空整个上下文（在请求结束时调用）
     */
    public static void clear() {
        Map<String, Object> ctx = contextHolder.get();
        if (ctx != null) {
            ctx.clear();
        }
        contextHolder.remove(); // 必须 remove ThreadLocal
    }
}